Zbiór prototypowy. Chcemy przekonać się, jakie możliwości będzie nam w stanie zaoferwoać spacy przy pracy z językiem rosyjskim. Dodanie analiz z języka rosyjskiego może stanowić wartościowy dodatek do całości projektu i dać odmienną perspektywę.
#! pip install swifter
#! pip install pandas
#! pip install textacy
#! pip install spacy
#! python -m spacy download ru_core_news_sm
import spacy
import pandas as pd
from tqdm.auto import tqdm
import swifter
import plotly.express as px
from wordcloud import WordCloud
from matplotlib import pyplot as plt
import textacy
from collections import Counter
import random
pd.options.plotting.backend = "plotly"
random.seed(123)
nlp = spacy.load("ru_core_news_sm")
df = pd.read_csv('russian_twitter_firstday_100k.csv')
df.head()
| Unnamed: 0 | Datetime | Tweet Id | Text | Username | Replies Count | Retweets Count | Likes Count | Quotes Count | Language | Retweeted Tweet | Quoted Tweet | Mentioned Users | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 2022-02-24 23:59:43+00:00 | 1496998305682894855 | @mishacollins 8 лет Украина издевалась над дет... | lulashca | 0 | 0 | 1 | 0 | ru | NaN | NaN | ['mishacollins'] |
| 1 | 1 | 2022-02-24 23:59:16+00:00 | 1496998190767345669 | Блять потом мои подружки будут говорить что Ук... | lazines_hashira | 0 | 0 | 4 | 0 | ru | NaN | NaN | NaN |
| 2 | 2 | 2022-02-24 23:59:09+00:00 | 1496998161898176512 | П.С. А тем временем, поставщики некоторых важн... | Marijuana5 | 2 | 0 | 0 | 0 | ru | NaN | NaN | NaN |
| 3 | 3 | 2022-02-24 23:58:56+00:00 | 1496998106986344448 | Александр Квасьневский(президент Польши 1995-2... | ilona_all | 1 | 0 | 1 | 0 | ru | NaN | NaN | NaN |
| 4 | 4 | 2022-02-24 23:58:54+00:00 | 1496998098954256388 | ❗️❗️❗️В Киевской области недалеко от Чернобыля... | _Lavr_Kornilov_ | 0 | 0 | 0 | 0 | ru | NaN | NaN | NaN |
df.shape
(16319, 13)
df.isna().sum()
Unnamed: 0 0 Datetime 0 Tweet Id 0 Text 0 Username 0 Replies Count 0 Retweets Count 0 Likes Count 0 Quotes Count 0 Language 0 Retweeted Tweet 16319 Quoted Tweet 15770 Mentioned Users 9275 dtype: int64
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 16319 entries, 0 to 16318 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Unnamed: 0 16319 non-null int64 1 Datetime 16319 non-null object 2 Tweet Id 16319 non-null int64 3 Text 16319 non-null object 4 Username 16319 non-null object 5 Replies Count 16319 non-null int64 6 Retweets Count 16319 non-null int64 7 Likes Count 16319 non-null int64 8 Quotes Count 16319 non-null int64 9 Language 16319 non-null object 10 Retweeted Tweet 0 non-null float64 11 Quoted Tweet 549 non-null object 12 Mentioned Users 7044 non-null object dtypes: float64(1), int64(6), object(6) memory usage: 1.6+ MB
df.describe()
| Unnamed: 0 | Tweet Id | Replies Count | Retweets Count | Likes Count | Quotes Count | Retweeted Tweet | |
|---|---|---|---|---|---|---|---|
| count | 16319.000000 | 1.631900e+04 | 16319.000000 | 16319.000000 | 16319.000000 | 16319.000000 | 0.0 |
| mean | 8159.000000 | 1.496823e+18 | 0.890128 | 2.338562 | 13.902016 | 0.122802 | NaN |
| std | 4711.033857 | 8.386446e+13 | 4.920187 | 26.053188 | 171.081142 | 1.081208 | NaN |
| min | 0.000000 | 1.496636e+18 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | NaN |
| 25% | 4079.500000 | 1.496756e+18 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | NaN |
| 50% | 8159.000000 | 1.496815e+18 | 0.000000 | 0.000000 | 1.000000 | 0.000000 | NaN |
| 75% | 12238.500000 | 1.496890e+18 | 1.000000 | 0.000000 | 4.000000 | 0.000000 | NaN |
| max | 16318.000000 | 1.496998e+18 | 297.000000 | 1100.000000 | 14511.000000 | 69.000000 | NaN |
df.Text[1]
'Блять потом мои подружки будут говорить что Украина сама виновата а у России не было выбора а я ничего не смогу им сказать потому что от любого спора с близкими подругами мне становится ужасно плохо боже'
len(df)
16319
df.nunique()
Unnamed: 0 16319 Datetime 14619 Tweet Id 16319 Text 16232 Username 10709 Replies Count 69 Retweets Count 138 Likes Count 308 Quotes Count 25 Language 1 Retweeted Tweet 0 Quoted Tweet 517 Mentioned Users 4378 dtype: int64
df.Datetime = pd.to_datetime(df.Datetime)
df.columns
Index(['Unnamed: 0', 'Datetime', 'Tweet Id', 'Text', 'Username',
'Replies Count', 'Retweets Count', 'Likes Count', 'Quotes Count',
'Language', 'Retweeted Tweet', 'Quoted Tweet', 'Mentioned Users'],
dtype='object')
df.Language.value_counts()
ru 16319 Name: Language, dtype: int64
df = df.drop('Unnamed: 0', 1)
df
| Datetime | Tweet Id | Text | Username | Replies Count | Retweets Count | Likes Count | Quotes Count | Language | Retweeted Tweet | Quoted Tweet | Mentioned Users | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2022-02-24 23:59:43+00:00 | 1496998305682894855 | @mishacollins 8 лет Украина издевалась над дет... | lulashca | 0 | 0 | 1 | 0 | ru | NaN | NaN | ['mishacollins'] |
| 1 | 2022-02-24 23:59:16+00:00 | 1496998190767345669 | Блять потом мои подружки будут говорить что Ук... | lazines_hashira | 0 | 0 | 4 | 0 | ru | NaN | NaN | NaN |
| 2 | 2022-02-24 23:59:09+00:00 | 1496998161898176512 | П.С. А тем временем, поставщики некоторых важн... | Marijuana5 | 2 | 0 | 0 | 0 | ru | NaN | NaN | NaN |
| 3 | 2022-02-24 23:58:56+00:00 | 1496998106986344448 | Александр Квасьневский(президент Польши 1995-2... | ilona_all | 1 | 0 | 1 | 0 | ru | NaN | NaN | NaN |
| 4 | 2022-02-24 23:58:54+00:00 | 1496998098954256388 | ❗️❗️❗️В Киевской области недалеко от Чернобыля... | _Lavr_Kornilov_ | 0 | 0 | 0 | 0 | ru | NaN | NaN | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 16314 | 2022-02-24 00:00:59+00:00 | 1496636234944425988 | Украина запросила срочное заседание Совбеза ОО... | ukupitko | 0 | 0 | 0 | 0 | ru | NaN | NaN | NaN |
| 16315 | 2022-02-24 00:00:30+00:00 | 1496636113733271552 | Украина инициировала срочное заседание Совбеза... | IT_STORY | 0 | 0 | 0 | 0 | ru | NaN | NaN | NaN |
| 16316 | 2022-02-24 00:00:21+00:00 | 1496636078152945664 | 🇺🇦 Украина выйдет из соглашения об увековечива... | MAKaminskiy | 0 | 0 | 0 | 0 | ru | NaN | NaN | NaN |
| 16317 | 2022-02-24 00:00:17+00:00 | 1496636058410303488 | @VRSoloviev Вот теперь даже интересно. Сейчас ... | andreisudakov | 0 | 0 | 2 | 0 | ru | NaN | NaN | ['VRSoloviev'] |
| 16318 | 2022-02-24 00:00:14+00:00 | 1496636048562180103 | @gendalf47 @rianru Они нацисты же. Думают, что... | GaziirHabbas | 1 | 0 | 3 | 0 | ru | NaN | NaN | ['gendalf47', 'rianru'] |
16319 rows × 12 columns
df["Text_nlp"] = df['Text'].swifter.apply(nlp)
df["Text_nlp_fixed"] = df["Text_nlp"].apply(lambda text:
[token.lemma_ for token in text
if not token.is_stop
if not token.is_punct])
df.Text[1]
'Блять потом мои подружки будут говорить что Украина сама виновата а у России не было выбора а я ничего не смогу им сказать потому что от любого спора с близкими подругами мне становится ужасно плохо боже'
df.Text_nlp[1]
Блять потом мои подружки будут говорить что Украина сама виновата а у России не было выбора а я ничего не смогу им сказать потому что от любого спора с близкими подругами мне становится ужасно плохо боже
df.Text_nlp_fixed[1]
['блять', 'потом', 'подружка', 'говорить', 'украина', 'виноватый', 'россия', 'выбор', 'ничто', 'смочь', 'сказать', 'потому', 'любой', 'спор', 'близкий', 'подругами', 'становиться', 'ужасно', 'плохо', 'боже']
from spacy import displacy
displacy.render(df.Text_nlp[1], style='ent',jupyter=True)
spacy.explain('LOC')
'Non-GPE locations, mountain ranges, bodies of water'
doc_lens = df.Text_nlp.str.len()
doc_lens.hist()
# Histogram ilości słów w tweetach.
from collections import Counter
word_counts = Counter(df.Text_nlp_fixed.sum())
wc = WordCloud(width=800, height=400)
wc.generate_from_frequencies(frequencies=word_counts)
plt.figure(figsize=(10,8))
plt.imshow(wc)
<matplotlib.image.AxesImage at 0x14654cd7a60>
word_counts.most_common(30)
[('украина', 18790),
('\n', 6717),
('россия', 4966),
('война', 2745),
('\n\n', 2623),
('год', 1643),
('путин', 1642),
('человек', 1416),
(' ', 1332),
('страна', 1273),
('хотеть', 1074),
('мир', 1044),
('донбасс', 1033),
('сейчас', 999),
('военный', 989),
('говорить', 968),
('российский', 906),
('8', 869),
('нато', 731),
('@ukraine', 718),
('🇺', 710),
('просто', 704),
('там', 686),
('рф', 680),
('какой', 638),
('новость', 613),
('знать', 610),
('зеленский', 609),
('начать', 607),
('против', 587)]
#! pip install translate
from translate import Translator
translator = Translator(from_lang="russian",to_lang="english")
translation = translator.translate("война")
translation
'war'
def translate_ru(text):
translator = Translator(from_lang="russian",to_lang="english")
translation = translator.translate(text)
return translation
translate_ru("война война война война")
'Oh, war, war!'
word_counts_translated = []
for word, count in word_counts.most_common(200):
try:
word_counts_translated.append((translate_ru(word), count))
except Exception as e:
continue
word_counts_translated = Counter(dict(word_counts_translated))
word_counts_translated.most_common(30)
[('Ukraine', 18790),
('Russia', 4966),
('war', 2745),
('year', 1643),
('Putin', 1642),
('persons', 1416),
('Country', 1273),
('want', 1074),
('world', 1044),
('Donbas', 1033),
('Now,', 999),
('военный', 989),
('speak', 968),
('8', 869),
('UKRAINE', 718),
('🇺🇸 ❤️', 710),
('Simple', 704),
('over there', 686),
('RF', 680),
('which', 638),
('news', 613),
('Aristocracy', 610),
('Zelensky', 609),
('to start', 607),
('vs.', 587),
('land', 569),
('why', 562),
('🇦🇪 Visit Expo 2020 Dubai', 550),
('Due', 545),
('Kiev', 536)]
wc = WordCloud(width=800, height=400)
wc.fit_words(dict(word_counts_translated))
plt.figure(figsize=(10,8))
plt.imshow(wc)
<matplotlib.image.AxesImage at 0x146551a4bb0>
counts = pd.DataFrame(word_counts.most_common(30), columns=['word', 'count'])
fig = px.bar(counts, orientation='h', y='word', x='count')
fig['layout']['yaxis']['autorange'] = "reversed"
fig.update_layout(bargap=0.30, font={'size':10})
fig
counts = pd.DataFrame(word_counts_translated.most_common(30), columns=['word', 'count'])
fig = px.bar(counts, orientation='h', y='word', x='count')
fig['layout']['yaxis']['autorange'] = "reversed"
fig.update_layout(bargap=0.30, font={'size':10})
fig
df.sort_values(by='Likes Count', ascending=False).head()
| Datetime | Tweet Id | Text | Username | Replies Count | Retweets Count | Likes Count | Quotes Count | Language | Retweeted Tweet | Quoted Tweet | Mentioned Users | Text_nlp | Text_nlp_fixed | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1500 | 2022-02-24 20:26:33+00:00 | 1496944659242835972 | наши ПОМОГАЮТ раненным вражеским солдатам. вы ... | vihoba | 81 | 1098 | 14511 | 26 | ru | NaN | NaN | NaN | (наши, ПОМОГАЮТ, раненным, вражеским, солдатам... | [помогают, раненным, вражеский, солдат, прикин... |
| 6138 | 2022-02-24 14:14:19+00:00 | 1496850983871254534 | Я помню, как Украина поддерживала Грузию. Я по... | Wizard_Severus | 17 | 355 | 6209 | 4 | ru | NaN | NaN | NaN | (Я, помню, ,, как, Украина, поддерживала, Груз... | [помнить, украина, поддерживать, грузия, помни... |
| 9209 | 2022-02-24 10:45:05+00:00 | 1496798331120488450 | Украина в одиночку бьется за общую Свободу - к... | Rouslan5 | 57 | 1100 | 5060 | 14 | ru | NaN | NaN | NaN | (Украина, в, одиночку, бьется, за, общую, Своб... | [украина, одиночка, биться, общий, свободу, ка... |
| 11536 | 2022-02-24 08:36:50+00:00 | 1496766053904490497 | дорогие россияне!\n\nвы МОЖЕТЕ помочь! \n\nсей... | miramira78 | 54 | 889 | 4851 | 29 | ru | NaN | NaN | NaN | (дорогие, россияне, !, \n\n, вы, МОЖЕТЕ, помоч... | [дорогой, россиянин, \n\n, помочь, \n\n, сейча... |
| 12352 | 2022-02-24 07:49:16+00:00 | 1496754083369299970 | я прошу - не давайте распространяться дезинфор... | uchj14 | 16 | 629 | 4634 | 4 | ru | NaN | NaN | NaN | (я, прошу, -, не, давайте, распространяться, д... | [просить, давать, распространяться, дезинформа... |
df.sort_values(by='Replies Count', ascending=False).head()
| Datetime | Tweet Id | Text | Username | Replies Count | Retweets Count | Likes Count | Quotes Count | Language | Retweeted Tweet | Quoted Tweet | Mentioned Users | Text_nlp | Text_nlp_fixed | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7327 | 2022-02-24 12:47:03+00:00 | 1496829021870563330 | ‼️ Обращение Президента Российской Федерации В... | LV_RUSEMBAS | 297 | 4 | 12 | 3 | ru | NaN | NaN | ['MID_RF', 'DaugavpilsRF', 'RConsulate', 'Cons... | (‼️, Обращение, Президента, Российской, Федера... | [‼️, обращение, президент, российский, федерац... |
| 14190 | 2022-02-24 05:55:02+00:00 | 1496725334737420289 | .@StateDeptSpox: Остерегайтесь дезинформации К... | USApoRusski | 288 | 452 | 1378 | 38 | ru | NaN | NaN | ['StateDeptSpox'] | (.@StateDeptSpox, :, Остерегайтесь, дезинформа... | [.@StateDeptSpox, остерегаться, дезинформация,... |
| 6641 | 2022-02-24 13:37:37+00:00 | 1496841747158437891 | Это конец России, при любом исходе. Украина бу... | Bau_In_Jener | 133 | 146 | 922 | 11 | ru | NaN | NaN | NaN | (Это, конец, России, ,, при, любом, исходе, .,... | [конец, россия, любой, исход, украина, разбомб... |
| 88 | 2022-02-24 23:37:12+00:00 | 1496992638263771146 | именно в этом курьезе и закрутилась украина. О... | MauMeirelles | 111 | 61 | 1352 | 9 | ru | NaN | NaN | NaN | (именно, в, этом, курьезе, и, закрутилась, укр... | [именно, курьёз, закрутиться, украина, осторож... |
| 416 | 2022-02-24 22:44:53+00:00 | 1496979471320109060 | Ужасное чувство брезгливости к президенту свое... | Aleksey_Smitt | 107 | 513 | 3285 | 11 | ru | NaN | NaN | NaN | (Ужасное, чувство, брезгливости, к, президенту... | [ужасный, чувство, брезгливость, президент, ст... |
most_liked = df.Text[1500]
most_liked
'наши ПОМОГАЮТ раненным вражеским солдатам. вы прикиньте. помогают раненным ВРАЖЕСКИМ солдатам и вы ещё смеете пиздеть что украина хочет воевать?'
# Nasi POMAGAJĄ rannym żołnierzom wroga.
# Zgadnij. pomagać rannym żołnierzom WROGA,
# a nadal ważysz się pieprzyć, że Ukraina chce walczyć?
most_liked2 = df.Text[6138]
most_liked2
'Я помню, как Украина поддерживала Грузию. Я помню мирные митинги в поддержку Беларуси. И помню, как поддерживали Казахстан.\n\nГоворить о происходящем и рассказывать правду – это не о сочувствии, это о человечности и об огромном страхе перед смертью.\nПожалуйста, не молчите.'
# „Pamiętam, jak Ukraina wspierała Gruzję. Pamiętam pokojowe wiece poparcia dla Białorusi.
# I pamiętam, jak wspierali Kazachstan.\n\nMówienie o tym, co się dzieje i mówienie prawdy, to nie współczucie,
# ale ludzkość i wielki strach przed śmiercią.\nProszę nie milczeć.'
most_liked3 = df.Text[9209]
most_liked3
'Украина в одиночку бьется за общую Свободу - какой ужас и стыд!'
# „Sama Ukraina walczy o wspólną Wolność – co za horror i wstyd!”
most_replied = df.Text[7327]
most_replied
'‼️ Обращение Президента Российской Федерации В.В.Путина (24 февраля 2022 г., Москва, Кремль) 🔗https://t.co/LlB3j9WTFV\n\n#ПрезидентРоссии #Обращение #Россия #Национальнаябезопасность #Донбасс #Украина @MID_RF @DaugavpilsRF @RConsulate @ConsLv https://t.co/9BDqQpiNqX'
# Post informujący o przemówieniu Putina napisany przez oficjalne rządowe konto - stąd tyle komentarzy.
most_replied2 = df.Text[14190]
most_replied2
'.@StateDeptSpox: Остерегайтесь дезинформации Кремля, пытающейся оправдать военные действия - ни одно из этих ложных утверждений не подтверждается доказательствами. \nУкраина НЕ совершает геноцид \nУкраина НЕ нападает на Донецк или Луганск \nУкраина НЕ проводит террористических атак'
# '.@StateDeptSpox: Strzeż się dezinformacji Kremla próbującej usprawiedliwić działania wojskowe
# - żadne z tych fałszywych twierdzeń nie jest poparte dowodami.
# \nUkraina NIE popełnia ludobójstwa \nUkraina NIE atakuje Doniecka ani Ługańska
# \nUkraina NIE przeprowadza ataków terrorystycznych”
most_replied3 = df.Text[6641]
most_replied3
'Это конец России, при любом исходе. Украина будет разбомблена, но мы её восстановим. Россияне никогда не отмоются от этого позора!'
# „To koniec Rosji, bez względu na wynik. Ukraina zostanie zbombardowana, ale my ją odbudujemy.
# Rosjanie nigdy nie zmyją się z tego wstydu!
#! conda install nbconvert
^C
#!jupyter nbconvert --execute --to pdf russian_data_eda.ipynb